package Common

import (
	"crypto/aes"
	"crypto/cipher"
	"encoding/base64"
)

// AESKey 是用于加密和解密的密钥，长度应为 16、24 或 32 字节
var AESKey = []byte("cai123456789mk00")

// AESEncrypt 加密函数
/*
	@plaintext 要加密的明文
	@return 加密后的字符串
*/
func AESEncrypt(plaintext []byte) (string, error) {
	block, err := aes.NewCipher(AESKey)
	if err != nil {
		return "", err
	}

	// 创建一个初始向量（IV），通常为 16 字节
	iv := make([]byte, aes.BlockSize)
	stream := cipher.NewCTR(block, iv)

	// 加密数据
	ciphertext := make([]byte, len(plaintext))
	stream.XORKeyStream(ciphertext, plaintext)

	// 将加密后的字节切片转换为 base64 编码的字符串以便存储和传输
	return base64.StdEncoding.EncodeToString(ciphertext), nil
}

// AESDecrypt 解密函数
/*
	@ciphertext 要解密的字符串
	@return 解密后的明文
*/
func AESDecrypt(ciphertext string) (string, error) {
	decodedCiphertext, err := base64.StdEncoding.DecodeString(ciphertext)
	if err != nil {
		return "", err
	}

	block, err := aes.NewCipher(AESKey)
	if err != nil {
		return "", err
	}

	// 创建一个初始向量（IV），通常为 16 字节
	iv := make([]byte, aes.BlockSize)
	stream := cipher.NewCTR(block, iv)

	// 解密数据
	plaintext := make([]byte, len(decodedCiphertext))
	stream.XORKeyStream(plaintext, decodedCiphertext)

	return string(plaintext), nil
}
